home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 163_01 / cc33.c < prev    next >
Text File  |  1990-11-18  |  5KB  |  209 lines

  1. /*
  2. ** true if val1 -> int pointer or int array and val2 not ptr or array
  3. */
  4. dbltest(val1,val2) int val1[], val2[]; {
  5.   if(val1[2]!=CINT) return 0;
  6.   if(val2[2]) return 0;
  7.   return 1;
  8.   }
  9.  
  10. /*
  11. ** determine type of binary operation
  12. */
  13. result(lval, lval2) int lval[], lval2[]; {
  14.   if((lval[2]!=0)&(lval2[2]!=0)) {
  15.     lval[2]=0;
  16.     }
  17.   else if(lval2[2]) {
  18.     lval[0]=lval2[0];
  19.     lval[1]=lval2[1];
  20.     lval[2]=lval2[2];
  21.     }
  22.  }
  23.  
  24. step(oper, lval) int oper, lval[]; {
  25.   if(lval[1]) {
  26.     if(lval[5]) {
  27.       push();
  28.       rvalue(lval);
  29.       oper(lval[2]>>2);
  30.       pop();
  31.       store(lval);
  32.       return;
  33.       }
  34.     else {
  35.       move();
  36.       lval[5]=1;
  37.       }
  38.     }
  39.   rvalue(lval);
  40.   oper(lval[2]>>2);
  41.   store(lval);
  42.   }
  43.  
  44. store(lval) int lval[];  {
  45.   if(lval[1]) putstk(lval);
  46.   else        putmem(lval);
  47.   }
  48.  
  49. rvalue(lval) int lval[];  {
  50.   if((lval[0]!=0)&(lval[1]==0)) getmem(lval);
  51.   else                          indirect(lval);
  52.   }
  53.  
  54. test(label, parens) int label, parens;  {
  55.   int lval[8];
  56.   char *before, *start;
  57.   if(parens) needtoken("(");
  58.   while(1) {
  59.     setstage(&before, &start);
  60.     if(heir1(lval)) rvalue(lval);
  61.     if(match(",")) clearstage(before, start);
  62.     else break;
  63.     }
  64.   if(parens) needtoken(")");
  65.   if(lval[3]) { /* constant expression */
  66.     clearstage(before, 0);
  67.     if(lval[4]) return;
  68.     jump(label);
  69.     return;
  70.     }
  71.   if(lval[7]) {  /* stage address of "oper 0" code */
  72.     oper=lval[6]; /* operator function address */
  73.          if((oper==eq)|
  74.             (oper==ule)) zerojump(eq0, label, lval);
  75.     else if((oper==ne)|
  76.             (oper==ugt)) zerojump(ne0, label, lval);
  77.     else if (oper==gt)   zerojump(gt0, label, lval);
  78.     else if (oper==ge)   zerojump(ge0, label, lval);
  79.     else if (oper==uge)  clearstage(lval[7],0);
  80.     else if (oper==lt)   zerojump(lt0, label, lval);
  81.     else if (oper==ult)  zerojump(ult0, label, lval);
  82.     else if (oper==le)   zerojump(le0, label, lval);
  83.     else                 testjump(label);
  84.     }
  85.   else testjump(label);
  86.   clearstage(before, start);
  87.   }
  88.  
  89. constexpr(val) int *val; {
  90.   int const;
  91.   char *before, *start;
  92.   setstage(&before, &start);
  93.   expression(&const, val);
  94.   clearstage(before, 0);  /* scratch generated code */
  95.   if(const==0) error("must be constant expression");
  96.   return const;
  97.   }
  98.  
  99. const(val) int val; {
  100.   immed();
  101.   outdec(val);
  102.   nl();
  103.   }
  104.  
  105. const2(val) int val; {
  106.   immed2();
  107.   outdec(val);
  108.   nl();
  109.   }
  110.  
  111. constant(lval) int lval[]; {
  112.   lval=lval+3;
  113.   *lval=1;     /* assume it will be a constant */
  114.   if(number(++lval))   immed();
  115.   else if (pstr(lval)) immed();
  116.   else if (qstr(lval)) {
  117.     *(lval-1)=0;  /* nope, its a string address  */
  118.     addr2();
  119.     printlabel(litlab);
  120.     outbyte('+');
  121.     }
  122.   else return 0;
  123.   outdec(*lval);
  124.   nl();
  125.   return 1;
  126.   }
  127.  
  128. number(val) int val[]; {
  129.   int k, minus;
  130.   k=minus=0;
  131.   if(match("-")) minus=1;
  132.   if(numeric(ch)==0) return 0;
  133.   if(ch == '0') { /* if octal or hex */
  134.     gch();
  135.     if(ch == 'X' || ch == 'x') { /* if hex */
  136.       gch();
  137.       while(1)
  138.         if(numeric(ch)) k = (k << 4) + (inbyte()-'0');
  139.         else if (ch >= 'a' && ch <= 'f') k = (k << 4) + (inbyte()-'a'+10);
  140.         else if (ch >= 'A' && ch <= 'F') k = (k << 4) + (inbyte()-'A'+10);
  141.         else break;
  142.       }
  143.     else {
  144.       while(ch >= '0' && ch <= '7') k = (k << 3) + (inbyte()-'0');
  145.       }
  146.     }
  147.   else {
  148.     while (numeric(ch)) k=k*10+(inbyte()-'0');
  149.     }
  150.   if(minus) k = (-k);
  151.   val[0]=k;
  152.   return 1;
  153.   }
  154.  
  155. /*
  156. ** fixed per A. Macpherson letter, DDJ #81
  157. */
  158. pstr(val)  int val[]; {
  159.   int k;
  160.   k=0;
  161.   if (match("'")==0) return 0;
  162.   while(ch!=39)    k=(k&255)*256 + (litchar()&255);
  163.   gch();
  164.   val[0]=k;
  165.   return 1;
  166.   }
  167.  
  168. qstr(val)  int val[]; {
  169.   char c;
  170.   if (match(quote)==0) return 0;
  171.   val[0]=litptr;
  172.   while (ch!='"') {
  173.     if(ch==0) break;
  174.     stowlit(litchar(), 1);
  175.     }
  176.   gch();
  177.   litq[litptr++]=0;
  178.   return 1;
  179.   }
  180.  
  181. stowlit(value, size) int value, size; {
  182.   if((litptr+size) >= LITMAX) {
  183.     error("literal queue overflow"); exit(EUSER);
  184.     }
  185.   putint(value, litq+litptr, size);
  186.   litptr=litptr+size;
  187.   }
  188.  
  189. /*
  190. ** return current literal char & bump lptr
  191. */
  192. litchar() {
  193.    int i, oct;
  194.    if((ch!=92)|(nch==0)) return gch();
  195.    gch();
  196.    if(ch=='b') {gch(); return  8;}  /*BS*/
  197.    if(ch=='t') {gch(); return  9;}  /*HT*/
  198.    if(ch=='n') {gch(); return 10;}  /*LF*/
  199.    if(ch=='f') {gch(); return 12;}  /*FF*/
  200.    if(ch=='r') {gch(); return 13;}  /*CR*/
  201.    if(ch==44)  {gch(); return 44;}  /* ' */
  202.    if(ch==92)  {gch(); return 92;}  /* \ */
  203.    i=3;oct=0;
  204.    while(((i--)>0)&(ch>='0')&(ch<='7')) oct=(oct<<3)+gch()-'0';
  205.    if(i==2) return gch(); else return oct;
  206.    }
  207.  
  208.  
  209.